#include <stdio.h>
#include <pthread.h>
#include <mqueue.h>
#include <string.h>

// 消息表述符
static mqd_t mqd;
// 队列文件的路径， /代表队列文件所在的目录 /dev/mqueue
static char *mq_name = "/mq_test";

void *thread1(void *arg){
    printf("thread1 线程启动\n");

    // 发送消息
    char *msg = "hello world";
    mq_send(mqd, msg, strlen(msg) + 1, 0);

    return NULL;
}

void *thread2(void *arg){
    printf("thread2 线程启动\n");

    // 接收消息
    char msg_buf[100];
    ssize_t len = mq_receive(mqd, msg_buf, 100, NULL);
    printf("接收到的消息：%s, 消息长度：%ld\n", msg_buf, len);

    return NULL;
}

int main(int argc, char const *argv[])
{
    printf("main 线程启动\n");

    // 创建消息队列
    struct mq_attr attr;
    attr.mq_msgsize = 100; // 消息的最大字节数
    attr.mq_maxmsg = 10; // 消息队列中最大消息数
    mqd = mq_open(mq_name, O_CREAT|O_RDWR, 0644, &attr);    // 0644表示权限
    if (mqd == -1) {
        printf("打开消息队列失败 \n");
        return -1;
    }

    // 创建线程
    pthread_t td1, td2;
    pthread_create(&td1, NULL, thread1, NULL);
    pthread_create(&td2, NULL, thread2, NULL);

    // 主线程等待子线程结束
    pthread_join(td1, NULL);
    pthread_join(td2, NULL);

    printf("main 线程结束\n");

    // 关闭消息队列
    mq_close(mqd);
    // 删除消息队列
    mq_unlink(mq_name);

    return 0;
}
